package com.taichuan.selfcheck;

import android.app.Application;
import android.content.Context;
import android.util.Log;
import androidx.multidex.MultiDex;
import com.g3288.g3288board.TcRk3399GpioClient;
import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.FormatStrategy;
import com.orhanobut.logger.Logger;
import com.orhanobut.logger.PrettyFormatStrategy;
import com.taichuan.camera.CameraIdTypeUtils;
import com.taichuan.camera.VankeSiteBoxCameraIdTypeUtils;
import com.taichuan.selfcheck.config.PropertyPreference;
import com.taichuan.selfcheck.crash.TcCrashCallback;
import com.taichuan.selfcheck.db.DaoManager;
import com.taichuan.selfcheck.utils.ResultRecordManager;
import com.taichuan.tcutils.common.SystemInfoUtils;
import com.taichuan.tcutils.taichuan.PrintUtils;
import com.taichuan.tcutils.taichuan.SystemUtils;
import com.tencent.bugly.Bugly;
import com.tencent.bugly.beta.Beta;
import com.tencent.bugly.crashreport.CrashReport;
import io.reactivex.functions.Consumer;
import io.reactivex.plugins.RxJavaPlugins;

/**
 * 该类主要用于
 *
 * @author CamelLuo
 * @version 2019/12/4
 */
public class BaseApplication extends Application {
    private static final String TAG = BaseApplication.class.getSimpleName();
    public static BaseApplication application;
    /**
     * 太川自检程序项目 腾讯Bugly ID
     * 暂时申请不到，先离线使用
     */
    private static final String TC_SELF_CHECK_BUGLY_APP_ID = "4fef85190a";

    @Override
    public void onCreate() {
        super.onCreate();
        application=this;
        //初始化项目配置信息，交由子类实现
        AppModuleBaseConfig appModuleConfig = initAppModuleConfig();

        //全局捕获RxJava异常，防止程序崩溃
        catchRxJavaError();

        // 初始化腾讯Bugly日志上报
        initBugly();

        //初始化数据库
        DaoManager.getInstance().init(this);

        //初始化Log库
        initLogger();
        //初始化SP库
        ResultRecordManager.getInstance().InitSP(getApplicationContext());
        PropertyPreference.get().initPropertyPreference(getApplicationContext());

        if (SystemUtils.isRk3399()){
            //初始化rk3399 gpio库
            TcRk3399GpioClient.getInstance().initGpio(false);

            if (!SystemUtils.isVankeSiteBoxDevice()){            //普通RK3399设备
                //初始化太川摄像头工具类库下的 摄像头工具类
                CameraIdTypeUtils.getInstance().init(this);
                CameraIdTypeUtils.getInstance().checkCheShenCameraIdType();
            }else {                             //万科智慧工地项目设备
                VankeSiteBoxCameraIdTypeUtils.getInstance().init(this);
                VankeSiteBoxCameraIdTypeUtils.getInstance().checkVankeSiteBoxCameraIdType();
            }
        }
    }

    /**
     * 全局捕获RxJava异常
     */
    private void catchRxJavaError() {
        RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                if (throwable != null){
                    String info = "全局捕获到 RxJava 异常： " + throwable.getMessage();
                    PrintUtils.get().print(PrintUtils.LogLevel.INFO, "RxJavaPlugins", info);
                }else {
                    String info = "全局捕获到 RxJava 异常： 异常实例对象为null";
                    PrintUtils.get().print(PrintUtils.LogLevel.INFO, "RxJavaPlugins", info);
                }
            }
        });
    }

    /**
     * 定义一个方法用于初始化腾讯Bugly日志上报
     */
    private void initBugly() {
        String appId = TC_SELF_CHECK_BUGLY_APP_ID;
        Context context = getApplicationContext();
        // 获取当前包名
        String packageName = context.getPackageName();
        // 获取当前进程名
        String processName = SystemInfoUtils.getProcessName(android.os.Process.myPid());
        // 设置是否为上报进程
        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context);
        strategy.setUploadProcess(processName == null || processName.equals(packageName));
        // 高级参数设置
        strategy.setAppChannel("release");  //设置渠道
        //设置Crash回调
        strategy.setCrashHandleCallback(new TcCrashCallback(this));
        // 应用升级-自动检测更新开关
        Beta.autoCheckUpgrade = false;
        // 应用升级-检查周期设置，单位s
        Beta.upgradeCheckPeriod = 60 * 60 * 1000;
        // 应用升级-自动安装开关
        Beta.autoInstallApk = false;
        // 应用升级-添加可显示弹窗的Activity
//        Beta.canShowUpgradeActs.add(MainActivity.class);
        // 初始化Bugly
        Log.i(TAG, "initBugly: " + appId);
        Bugly.init(context, appId, false, strategy);
    }

    private void initLogger() {
        FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                .showThreadInfo(false)  //（可选）是否显示线程信息。 默认值为true
                .methodCount(0)         // （可选）要显示的方法行数。 默认2
                .methodOffset(7)        // （可选）隐藏内部方法调用到偏移量。 默认5
                .tag("Tc-selfcheck")   //（可选）每个日志的全局标记。 默认PRETTY_LOGGER
                .build();
        Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy) {
            @Override
            public boolean isLoggable(int priority, String tag) {
                return true;
            }
        });
    }

    /**
     * 初始化App各功能Module 的配置信息
     * @return
     */
    protected AppModuleBaseConfig initAppModuleConfig(){
        return new SelfCheckAppModuleConfig();
    }

    public static Context getApplication(){
        return application.getApplicationContext();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        /**
         * 因该项目方法数已超过65536，因此引入谷歌 MultiDex 进行分包
         */
        MultiDex.install(this);
    }
}
